package clara.azin.view;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Observable;
import java.util.Observer;

import javax.swing.text.html.parser.ParserDelegator;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Shell;
//Classe che gestisce la vista relativa ad una pagina HTML contenuta nell'albero. 
//Viene aperta quando nella vista principale viene cliccato un elemento dell'albero.
//Se la pagina non contiene testo HTML, verra' visualizzato un messaggio d'errore.

import clara.azin.controller.WebTreeAzinController;
//Classe che gestisce la vista relativa ad una pagina HTML contenuta nell'albero. 
//Viene aperta quando nella vista principale viene cliccato un elemento dell'albero.
//Se la pagina non contiene testo HTML, verra' visualizzato un messaggio d'errore.


public class ContentView extends Shell implements Observer{

	protected void checkSubclass() {}
	
	// Riferimento al controller.
	
	public WebTreeAzinController controller;
	
	//Riferimento alla casella di testo (con stili) in cui si trova il testo da visualizzare.
	
	public StyledText content;


	//Costruisce la vista
	
	private ContentView(WebTreeAzinController controller) {
		super( controller.display );
		this.controller = controller;
		setLayout( new GridLayout( 1, false ) );
		addDisposeListener( controller );
		content = new StyledText(this, SWT.BORDER | SWT.V_SCROLL | SWT.MULTI | SWT.READ_ONLY | SWT.WRAP );
		GridData contentGridData = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
		contentGridData.widthHint = 1000;
		contentGridData.heightHint = 600;
		content.setLayoutData(contentGridData);
		
		pack();
		open();
	}

	//Metodo di fabbricazione per la costruzione della vista
	
	public static ContentView createContentView(WebTreeAzinController controller){
		return new ContentView(controller);
	}

	//Imposta il contenuto della vista.
	//l'url passato e' quello relativo alla pagina da visualizzare.
	
	public void refreshContent( URL url ) {
		String t;
		StringBuffer s = new StringBuffer();
		HttpURLConnection conn;
		InputStreamReader i;
		// prova ad aprire una connessione e verifica se effettivamente e' una pagina di testo HTML
		// se non lo e', oppure se non riesce ad aprire la connessione, lo notifica scrivendo che non e' una pagina di testo
		try {
			conn = (HttpURLConnection) url.openConnection();
			if (!conn.getContentType().startsWith("text/html") || conn.getContentType() == null){
				content.append("Not a text page.");
				return;
			}

			i = new InputStreamReader(conn.getInputStream(), "ISO-8859-1");
			BufferedReader r = new BufferedReader(i);
			t = r.readLine();
			s.append(t);
			while (t!=null) {
				t = r.readLine();
				if (t!=null) {
					s.append(t + " ");
				}
			}
			ParserDelegator p = new ParserDelegator();
			String temp = s.toString();
			// sostituisce alcune entities con i caratteri visualizzabili
			temp = temp.replaceAll("&ldquo;", String.valueOf('"'));
			temp = temp.replaceAll("&rdquo;", String.valueOf('"'));
			
			temp = temp.replaceAll("&apos;", "'");
			temp = temp.replaceAll("&quot;", String.valueOf('"'));
			temp = temp.replaceAll("&amp;", String.valueOf('&'));
			temp = temp.replaceAll("&lt;", String.valueOf('<'));
			temp = temp.replaceAll("&gt;", String.valueOf('>'));
			temp = temp.replaceAll("&nbsp;", String.valueOf(' '));
		 	
			// aggiorna lo stringBuffer con il testo avente le entities rimpiazzate
			s.delete(0,s.length());
			s.append(temp);
			StringReader reader = new StringReader(s.toString());
			MyCallback m = new MyCallback(this);
			try {
				p.parse(reader, m, true);
			} catch (IOException e) {
				content.append("Not a text page.");
			}
		} catch (IOException e) {
			content.append("Not a text page.");
		} catch (NullPointerException e){
			content.append("Error: cannot open this page.");
		}

	}

	public void update(Observable arg0, Object arg1) {
		// in update non c'e' nulla, Observer viene implementato solo per fare in modo che l'applicazione
		// non venga chiusa se c'e' ancora una di queste finestre aperte
	}
}
